import 'package:shared_preferences/shared_preferences.dart';

import 'json_helper.dart';

class DBHelper {
  // 静态的插入或更新对象方法
  static Future<void> save<T extends JsonSerializable>(String keyPrefix, String id, T object) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    // 获取已有数据
    Map<String, dynamic> existingData = JsonHelper.deserialize(prefs.getString(keyPrefix) ?? '{}');

    // 更新或添加新对象
    existingData[id] = JsonHelper.serialize(object);

    // 保存回 SharedPreferences
    await prefs.setString(keyPrefix, JsonHelper.serialize(existingData));
  }

  // 静态的获取所有对象（可排序）
  static Future<List<T>> getAll<T extends JsonSerializable>(String keyPrefix, JsonConstructor<T> fromJson,
      {String? sortBy, bool ascending = true}) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    // 获取数据集
    Map<String, dynamic> existingData = JsonHelper.deserialize(prefs.getString(keyPrefix) ?? '{}');

    // 转换为对象列表
    List<T> objectList = existingData.values.map((jsonString) => fromJson(JsonHelper.deserialize(jsonString))).toList();

    // 如果需要排序
    if (sortBy != null) {
      objectList.sort((a, b) {
        var aValue = (a as dynamic)[sortBy];
        var bValue = (b as dynamic)[sortBy];

        if (ascending) {
          return aValue.compareTo(bValue);
        } else {
          return bValue.compareTo(aValue);
        }
      });
    }

    return objectList;
  }

  // 静态的获取单个对象
  static Future<T?> get<T extends JsonSerializable>(String keyPrefix, String id, JsonConstructor<T> fromJson) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    // 获取数据集
    Map<String, dynamic> existingData = JsonHelper.deserialize(prefs.getString(keyPrefix) ?? '{}');

    // 获取对应对象
    String? jsonString = existingData[id];
    if (jsonString != null) {
      return fromJson(JsonHelper.deserialize(jsonString));
    }
    return null;
  }

  // 静态的删除对象
  static Future<void> delete(String keyPrefix, String id) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    // 获取已有数据
    Map<String, dynamic> existingData = JsonHelper.deserialize(prefs.getString(keyPrefix) ?? '{}');

    // 删除指定对象
    existingData.remove(id);

    // 保存更新后的数据
    await prefs.setString(keyPrefix, JsonHelper.serialize(existingData));
  }

  // 静态的删除所有对象
  static Future<void> deleteAll(String keyPrefix) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    // 清空该前缀下的数据
    await prefs.remove(keyPrefix);
  }
}
